home *** CD-ROM | disk | FTP | other *** search
/ Software Vault: The Gold Collection / Software Vault - The Gold Collection (American Databankers) (1993).ISO / cdr06 / winqueen.zip / QUEEN.PAS < prev    next >
Pascal/Delphi Source File  |  1993-07-06  |  21KB  |  658 lines

  1. program QUEEN;
  2.  
  3. uses wintypes, winprocs, wobjects;
  4. const
  5.   appname : pchar = 'Queen';
  6. var
  7.   back : integer;
  8.   face : array[1..10] of hbitmap;
  9. type
  10.   tmyapplication = object(tapplication)
  11.     procedure initmainwindow; virtual;
  12.   end;
  13.   pdeckwindow = ^tdeckwindow;
  14.   tdeckwindow = object(twindow)
  15.     oldback, newback : integer;
  16.     constructor init(aparent : pwindowsobject; aname : pchar);
  17.     procedure frameit(dc : hdc);
  18.     procedure paint(dc : hdc; var ps : tpaintstruct); virtual;
  19.     procedure pressok(var msg : tmessage); virtual id_first + id_ok;
  20.     procedure wmlbuttondown(var msg : tmessage); virtual wm_first + wm_lbuttondown;
  21.   end;
  22.   pqueenwindow = ^tqueenwindow;
  23.   tqueenwindow = object(twindow)
  24.     cardsize, newrect : trect;
  25.     newgx, newgy, level : integer;
  26.     move : array[1..3] of integer;
  27.     buttondown, moved, fin : boolean;
  28.     card : array[1..53] of hbitmap;
  29.     dealt : array[1..52] of boolean;
  30.     game : array[1..55] of record
  31.       deck : 1..53;
  32.       gx, gy : integer;
  33.       row : 1..11;
  34.       col : 1..24;
  35.       canopen, canmove, opened, onscreen : boolean;
  36.     end;
  37.     pos : array[1..11, 1..24] of record
  38.       num : 1..53;
  39.       px, py : integer;
  40.       rects : trect;
  41.     end;
  42.     constructor init(aparent : pwindowsobject; aname : pchar);
  43.     procedure defcommandproc(var msg : tmessage); virtual;
  44.     procedure drawbmp(dc : hdc; x, y : integer; size : trect; bitmap : hbitmap);
  45.     function getclassname : pchar; virtual;
  46.     procedure getwindowclass(var awndclass : twndclass); virtual;
  47.     procedure moving;
  48.     procedure newgame;
  49.     procedure paint(dc : hdc; var ps : tpaintstruct); virtual;
  50.     procedure setupwindow; virtual;
  51.     procedure wmdestroy(var msg : tmessage); virtual wm_first + wm_destroy;
  52.     procedure wmlbuttondown(var msg : tmessage); virtual wm_first + wm_lbuttondown;
  53.     procedure wmlbuttonup(var msg : tmessage); virtual wm_first + wm_lbuttonup;
  54.     procedure wmmousemove(var msg : tmessage); virtual wm_first + wm_mousemove;
  55.     procedure wmrbuttondown(var msg : tmessage); virtual wm_first + wm_rbuttondown;
  56.     procedure wmtimer(var msg : tmessage); virtual wm_first + wm_timer;
  57.   end;
  58.  
  59. constructor tdeckwindow.init(aparent : pwindowsobject; aname : pchar);
  60. var pbuttonok : pbutton;
  61. begin
  62.   twindow.init(aparent, aname);
  63.   with attr do begin
  64.     style := ws_caption or ws_visible;
  65.     x := 100;  y := 100;
  66.     w := 280;  h := 200;
  67.   end;
  68.   pbuttonok := new(pbutton, init(@self, id_ok, '&Ok', 110, 140, 60, 30, false));
  69.   oldback := back;
  70.   newback := back;
  71. end;
  72.  
  73. procedure tdeckwindow.frameit(dc : hdc);
  74. var i1, x, y : integer;
  75.   pbrush : hbrush;
  76.   rect : trect;
  77. begin
  78.   x := 20 + 50 * ((oldback - 1) mod 5);
  79.   y := 10 + 64 * ((oldback - 1) div 5);
  80.   setrect(rect, x, y, x + 40, y + 54);
  81.   inflaterect(rect, 2, 2);
  82.   pbrush := getstockobject(white_brush);
  83.   for i1 := 1 to 3 do begin
  84.     inflaterect(rect, 1, 1);
  85.     framerect(dc, rect, pbrush);
  86.   end;
  87.   x := 20 + 50 * ((newback - 1) mod 5);
  88.   y := 10 + 64 * ((newback - 1) div 5);
  89.   setrect(rect, x, y, x + 40, y + 54);
  90.   inflaterect(rect, 2, 2);
  91.   pbrush := getstockobject(gray_brush);
  92.   for i1 := 1 to 3 do begin
  93.     inflaterect(rect, 1, 1);
  94.     framerect(dc, rect, pbrush);
  95.   end;
  96.   oldback := newback;
  97. end;
  98.  
  99. procedure tdeckwindow.paint(dc : hdc; var ps : tpaintstruct);
  100. var i1, i2, x, y : integer;
  101.   memdc : hdc;
  102. begin
  103.   memdc := createcompatibledc(dc);
  104.   for i1 := 1 to 2 do
  105.     for i2 := 1 to 5 do begin
  106.       selectobject(memdc, face[i2 + 5 * (i1 - 1)]);
  107.       x := 20 + 50 * (i2 - 1);
  108.       y := 10 + 64 * (i1 - 1);
  109.       stretchblt(dc, x, y, 40, 54, memdc, 0, 0, 71, 96, srccopy);
  110.     end;
  111.   frameit(dc);
  112.   deletedc(memdc);
  113. end;
  114.  
  115. procedure tdeckwindow.pressok(var msg : tmessage);
  116. begin
  117.   closewindow;
  118.   if back <> oldback then begin
  119.     back := oldback;
  120.     with pqueenwindow(parent)^ do
  121.       if not game[52].opened then card[53] := face[back];
  122.     invalidaterect(hwindow, nil, true);
  123.   end;
  124. end;
  125.  
  126. procedure tdeckwindow.wmlbuttondown(var msg : tmessage);
  127. var i1, i2, x, y : integer;
  128.   rect : trect;
  129.   dc : hdc;
  130. begin
  131.   for i1 := 1 to 2 do
  132.     for i2 := 1 to 5 do begin
  133.       x := 20 + 50 * (i2 - 1);
  134.       y := 10 + 64 * (i1 - 1);
  135.       setrect(rect, x, y, x + 40, y + 54);
  136.       if ptinrect(rect, tpoint(msg.lparam)) then begin
  137.         newback := i2 + 5 * (i1 - 1);
  138.         if oldback <> newback then begin
  139.           dc := getdc(hwindow);
  140.           frameit(dc);
  141.           releasedc(hwindow, dc);
  142.         end;
  143.       end;
  144.     end;
  145. end;
  146.  
  147. constructor tqueenwindow.init(aparent : pwindowsobject; aname : pchar);
  148. begin
  149.   twindow.init(aparent, appname);
  150.   with attr do begin
  151.     x := 40;  y := 30;
  152.     w := 700; h := 500;
  153.     style := ws_caption or ws_sysmenu or ws_minimizebox;
  154.   end;
  155.   buttondown := false;
  156.   setrect(cardsize, 0, 0, 71, 96);
  157.   move[3] := 0;
  158.   level := 1;
  159.   back := 1;
  160.   messagebox(hwindow, '"addictions" vol.I - written by Steven', 'Queen', mb_ok);
  161.   newgame;
  162. end;
  163.  
  164. procedure tqueenwindow.defcommandproc(var msg : tmessage);
  165. var pabout : pdialog;
  166.   pdeck : pwindow;
  167.   i1 : array[0..5] of char;
  168.   newdeck : integer;
  169. begin
  170.   if msg.wparamhi = 0 then
  171.     case msg.wparamlo of
  172.       101 : newgame;
  173.       102 : begin
  174.         pdeck := new(pdeckwindow, init(@self, 'Select Card Back'));
  175.         application^.makewindow(pdeck);
  176.       end;
  177.       103 : done;
  178.       104 : begin
  179.         new(pabout, init(@self, 'queenabout'));
  180.         if application^.execdialog(pabout) = id_ok then application^.done;
  181.       end;
  182.       else twindow.defcommandproc(msg);
  183.     end;
  184. end;
  185.  
  186. procedure tqueenwindow.drawbmp(dc : hdc; x, y : integer; size : trect; bitmap : hbitmap);
  187. var memdc : hdc;
  188.   bm : tbitmap;
  189.   madedc : boolean;
  190. begin
  191.   if dc = 0 then begin
  192.     dc := getdc(hwindow);
  193.     madedc := true;
  194.   end
  195.   else madedc := false;
  196.   memdc := createcompatibledc(dc);
  197.   selectobject(memdc, bitmap);
  198.   with size do
  199.     bitblt(dc, x, y, right - left, bottom - top, memdc, left, top, srccopy);
  200.   deletedc(memdc);
  201.   if madedc then releasedc(hwindow, dc);
  202. end;
  203.  
  204. function tqueenwindow.getclassname;
  205. begin
  206.   getclassname := appname;
  207. end;
  208.  
  209. procedure tqueenwindow.getwindowclass(var awndclass : twndclass);
  210. begin
  211.   twindow.getwindowclass(awndclass);
  212.   awndclass.hicon := loadicon(hinstance, appname);
  213.   attr.menu := loadmenu(hinstance, appname);
  214. end;
  215.  
  216. procedure tqueenwindow.moving;
  217. var i1, i2 : integer;
  218.   dc, memdc : hdc;
  219.   temp : array[1..2] of trect;
  220.   temp2 : trect;
  221. begin
  222.   with game[move[3]] do begin
  223.     dc := getdc(hwindow);
  224.     memdc := createcompatibledc(dc);
  225.     selectobject(memdc, card[deck]);
  226.     setrect(newrect, newgx, newgy, newgx + 71, newgy + 96);
  227.     if intersectrect(temp[1], newrect, pos[row, col].rects) = 0 then begin
  228.       setrect(temp[1], gx, gy, gx + 71, gy + 96);
  229.       setrect(temp[2], gx, gy, gx + 71, gy + 96);
  230.     end
  231.     else begin
  232.       temp[2] := temp[1];
  233.       if gx < newgx then begin
  234.         temp[1].left := gx;
  235.         temp[1].right := newgx;
  236.         temp[2].left := gx;
  237.       end;
  238.       if gx > newgx then begin
  239.         temp[1].left := newgx + 71;
  240.         temp[1].right := gx + 71;
  241.         temp[2].right := gx + 71;
  242.       end;
  243.       if gy < newgy then begin
  244.         temp[2].top := gy;
  245.         temp[2].bottom := newgy;
  246.       end;
  247.       if gy > newgy then begin
  248.         temp[2].top := newgy + 96;
  249.         temp[2].bottom := gy + 96;
  250.       end;
  251.       if not fin then begin
  252.         if gx = newgx then temp[1].right := newgx;
  253.         if gy = newgy then temp[2].bottom := newgy;
  254.       end;
  255.     end;
  256.     for i2 := 1 to 2 do
  257.       with temp[i2] do
  258.         bitblt(dc, left, top, right - left, bottom - top, memdc, 0, 0, whiteness);
  259.     deletedc(memdc);
  260.     releasedc(hwindow, dc);
  261.     for i1 := 1 to 53 do
  262.       if (i1 <> move[3]) and game[i1].onscreen then
  263.         if intersectrect(temp[1], pos[game[i1].row, game[i1].col].rects,
  264.           pos[row, col].rects) <> 0 then begin
  265.           temp[2] := temp[1];
  266.           if (gx < newgx) and (newgx < temp[1].right) then
  267.             temp[1].right := newgx;
  268.           if (gx > newgx) and (newgx + 71 > temp[1].left) then
  269.             temp[1].left := newgx + 71;
  270.           if (gy < newgy) and (newgy < temp[2].bottom) then
  271.             temp[2].bottom := newgy;
  272.           if (gy > newgy) and (newgy + 96 > temp[2].top) then
  273.             temp[2].top := newgy + 96;
  274.           if not fin then begin
  275.             if gx = newgx then temp[1].right := newgx;
  276.             if gy = newgy then temp[2].bottom := newgy;
  277.           end;
  278.           for i2 := 1 to 2 do begin
  279.             offsetrect(temp[i2], - game[i1].gx, - game[i1].gy);
  280.             if not game[i1].opened then
  281.               drawbmp(dc, game[i1].gx + temp[i2].left, game[i1].gy +
  282.               temp[i2].top, temp[i2], face[back])
  283.             else drawbmp(dc, game[i1].gx + temp[i2].left, game[i1].gy +
  284.               temp[i2].top, temp[i2], card[game[i1].deck]);
  285.           end;
  286.         end;
  287.   end;
  288. end;
  289.  
  290. procedure tqueenwindow.newgame;
  291. var i1, ran : 1..53;
  292.   ro, co : integer;
  293. begin
  294.   i1 := 1;
  295.   for ro := 1 to 7 do
  296.     for co := 1 to ro do
  297.       with game[i1] do begin
  298.         row := ro;  col := co;
  299.         with pos[row, col] do begin
  300.           num := i1;
  301.           px := round(350 - 76 * (row / 2 - col + 1));
  302.           py := (ro - 1) * 30 + 10;
  303.           gx := px;  gy := py;
  304.           setrect(rects, px, py, px + 71, py + 96);
  305.         end;
  306.         i1 := i1 + 1;
  307.       end;
  308.   with game[53] do begin
  309.     row := 10;  col := 10;  gx := 15;  gy := 310;  deck := 53;
  310.     with pos[row, col] do begin
  311.       px := gx;  py := gy;  num := 53;
  312.       setrect(pos[row, col].rects, px, py, px + 71, py + 96);
  313.     end;
  314.   end;
  315.   randomize;
  316.   game[1].deck := 38;
  317.   game[1].canopen := true;
  318.   game[1].opened := true;
  319.   game[53].canopen := true;
  320.   game[53].canmove := false;
  321.   game[53].opened := true;
  322.   game[53].onscreen := true;
  323.   for i1 := 1 to 52 do begin
  324.     dealt[i1] := false;
  325.     game[i1].canmove := false;
  326.     game[i1].onscreen := true;
  327.     if i1 > 28 then game[i1].onscreen := false;
  328.   end;
  329.   dealt[38] := true;
  330.   for i1 := 2 to 52 do begin
  331.     repeat
  332.       ran := random(52) + 1
  333.     until dealt[ran] = false;
  334.     game[i1].deck := ran;
  335.     game[i1].canopen := false;
  336.     game[i1].opened := false;
  337.     dealt[ran] := true;
  338.   end;
  339.   for i1 := 22 to 28 do begin
  340.     game[i1].canopen := true;
  341.     game[i1].canmove := true;
  342.     game[i1].opened := true;
  343.   end;
  344.   card[53] := loadbitmap(hinstance, pchar(back + 52));
  345.   invalidaterect(hwindow, nil, true);
  346.   for i1 := 29 to 52 do
  347.     with game[i1] do begin
  348.       row := 11;  col := i1 - 28;
  349.       with pos[row, col] do begin
  350.         num := i1;
  351.         px := round(500 / 23 * (col - 1)) + 100;
  352.         py := 310;
  353.         gx := px;  gy := py;
  354.         setrect(pos[row, col].rects, px, py, px + 71, py + 96);
  355.       end;
  356.     end;
  357. end;
  358.  
  359. procedure tqueenwindow.paint(dc : hdc; var ps : tpaintstruct);
  360. var i1 : 1..53;
  361. begin
  362.   for i1 := 1 to 53 do
  363.     with game[i1] do
  364.       if onscreen then begin
  365.         if not opened then drawbmp(dc, gx, gy, cardsize, face[back])
  366.         else drawbmp(dc, gx, gy, cardsize, card[deck]);
  367.       end;
  368. end;
  369.  
  370. procedure tqueenwindow.setupwindow;
  371. var i1 : 1..52;
  372. begin
  373.   twindow.setupwindow;
  374.   for i1 := 1 to 52 do
  375.     card[i1] := loadbitmap(hinstance, pchar(i1));
  376.   for i1 := 1 to 10 do
  377.     face[i1] := loadbitmap(hinstance, pchar(i1 + 52));
  378.   card[53] := face[back];
  379. end;
  380.  
  381. procedure tqueenwindow.wmdestroy(var msg : tmessage);
  382. var i1 : 1..53;
  383. begin
  384.   for i1 := 1 to 53 do
  385.     deleteobject(card[i1]);
  386.   for i1 := 1 to 10 do
  387.     deleteobject(face[i1]);
  388.   twindow.wmdestroy(msg);
  389. end;
  390.  
  391. procedure tqueenwindow.wmlbuttondown(var msg : tmessage);
  392. var i1, co : 1..53;
  393.   temp : trect;
  394. begin
  395.   if not game[1].onscreen then begin
  396.     buttondown := true;
  397.     killtimer(hwindow, 1);
  398.     for i1 := 1 to 53 do
  399.       game[i1].onscreen := false;
  400.     invalidaterect(hwindow, nil, true);
  401.     level := level + 1;
  402.     if messagebox(hwindow, 'Do you want another one ?', 'You did it !',
  403.       mb_yesno or mb_iconexclamation) = id_yes then newgame
  404.     else done;
  405.   end;
  406.   if not buttondown then begin
  407.     fin := false;
  408.     move[3] := 0;
  409.     for i1 := 1 to 53 do begin
  410.       with game[i1] do
  411.         if ptinrect(pos[row, col].rects, tpoint(msg.lparam)) and onscreen then
  412.           move[3] := i1;
  413.     end;
  414.     if move[3] = 53 then buttondown := true;
  415.     if move[3] <> 0 then
  416.       with game[move[3]] do begin
  417.         move[1] := msg.lparamlo - gx;
  418.         move[2] := msg.lparamhi - gy;
  419.         setrect(temp, gx, gy, gx + 71, gy + 96);
  420.         if opened and ((Deck mod 13) = 0) then begin
  421.           buttondown := true;
  422.           onscreen := false;
  423.         end;
  424.         if (canopen and not opened) and (move[3] < 29) then begin
  425.           opened := true;
  426.           buttondown := true;
  427.         end;
  428.       end;
  429.   end;
  430. end;
  431.  
  432. procedure tqueenwindow.wmlbuttonup(var msg : tmessage);
  433. var i1, ro, co : 1..52;
  434.   temp : trect;
  435.   only1, cancel, head, tail : integer;
  436.   cancancel : boolean;
  437. begin
  438.   if buttondown and (move[3] <> 0) then begin
  439.     if move[3] = 53 then begin
  440.       if not game[52].opened then begin
  441.         i1 := 28;
  442.         repeat
  443.           i1 := i1 + 1;
  444.           with game[i1] do
  445.             if not opened then begin
  446.               canopen := true;
  447.               opened := true;
  448.               canmove := true;
  449.               onscreen := true;
  450.               invalidaterect(hwindow, @pos[row, col].rects, true);
  451.               i1 := 52;
  452.             end;
  453.         until i1 > 51;
  454.       end;
  455.       if game[52].opened then begin
  456.         card[53] := loadbitmap(hinstance, pchar(63));
  457.         invalidaterect(hwindow, @pos[10, 10].rects, true);
  458.       end;
  459.     end
  460.     else with game[move[3]] do begin
  461.       only1 := 0;
  462.       newgx := gx;  newgy := gy;
  463.       fin := true;
  464.       moving;
  465.       if moved then begin
  466.         for i1 := 1 to 52 do
  467.           if intersectrect(temp, pos[game[i1].row, game[i1].col].rects,
  468.             pos[row, col].rects) <> 0 then
  469.             if ((deck mod 13) + (game[i1].deck mod 13)) = 13 then
  470.               with game[i1] do begin
  471.                 if i1 = 1 then begin
  472.                   if (move[3] = 2) and not game[3].onscreen then
  473.                     game[1].canmove := true;
  474.                   if (move[3] = 3) and not game[2].onscreen then
  475.                     game[1].canmove := true;
  476.                 end;
  477.                 if opened and onscreen then begin
  478.                   if canmove then begin
  479.                     only1 := only1 + 1;
  480.                     cancel := i1;
  481.                   end
  482.                   else if (move[3] > 28) and (i1 > 28) then begin
  483.                     cancancel := true;
  484.                     if abs(i1 - move[3]) = 1 then begin
  485.                       only1 := only1 + 1;
  486.                       cancel := i1;
  487.                     end
  488.                     else begin
  489.                       for co := 1 to abs(i1 - move[3]) - 1 do begin
  490.                         if (i1 > move[3]) and game[move[3] + co].onscreen then
  491.                           cancancel := false;
  492.                         if (i1 < move[3]) and game [i1 + co].onscreen then
  493.                           cancancel := false;
  494.                       end;
  495.                       if cancancel then begin
  496.                         only1 := only1 + 1;
  497.                         cancel := i1;
  498.                       end;
  499.                     end;
  500.                   end;
  501.                 end;
  502.               end;
  503.         if only1 = 1 then with game[cancel] do begin
  504.           onscreen := false;
  505.           game[move[3]].onscreen := false;
  506.           invalidaterect(hwindow, @pos[row, col].rects, true);
  507.         end;
  508.       end;
  509.       for ro := 1 to 6 do
  510.         for co := 1 to ro do
  511.           if (not game[pos[ro + 1, co].num].onscreen) and (not game[pos[ro + 1,
  512.             co + 1].num].onscreen) then
  513.             with game[pos[ro, co].num] do begin
  514.               canopen := true;
  515.               canmove := true;
  516.             end;
  517.       gx := pos[row, col].px;  gy := pos[row, col].py;
  518.       newgx := gx;  newgy := gy;
  519.       setrect(pos[row, col].rects, gx, gy, gx + 71, gy + 96);
  520.       if only1 <> 1 then invalidaterect(hwindow, @pos[row, col].rects, true);
  521.     end;
  522.   end;
  523.   head := 1;
  524.   tail := 29;
  525.   for i1 := 29 to 52 do begin
  526.     game[i1].canmove := false;
  527.     if game[i1].onscreen and (head = 1) then head := i1;
  528.     if game[i1].onscreen and game[i1].opened then tail := i1;
  529.   end;
  530.   if head = 1 then head := 29;
  531.   game[head].canmove := true;
  532.   game[tail].canmove := true;
  533.   i1 := 1;
  534.   repeat
  535.     tail := 1;
  536.     with pos[11, i1] do
  537.       if not game[num].onscreen and game[num].opened then begin
  538.         game[55] := game[num];
  539.         head := i1;
  540.         repeat
  541.           with pos[11, head + 1] do begin
  542.             game[54] := game[num];
  543.             game[num].gx := game[55].gx;
  544.             game[num].gy := game[55].gy;
  545.             game[num].col := game[55].col;
  546.             pos[11, head].num := num;
  547.             game[55] := game[54];
  548.             if (head = 1) and game[pos[11, 1].num].onscreen then
  549.               invalidaterect(hwindow, @pos[11, 1].rects, true);
  550.             if game[num].onscreen then invalidaterect(hwindow, @rects, true);
  551.           end;
  552.           head := head + 1;
  553.         until (pos[11, head].num > 51) or (head > 23);
  554.         if (i1 = 1) and not game[num].onscreen then tail := 0;
  555.         if (i1 > 1) and not game[52].opened then tail := 0;
  556.       end;
  557.     i1 := i1 + tail;
  558.   until (i1 > 22) or (pos[11, i1].num = 52);
  559.   if not game[1].onscreen then begin
  560.     if move[3] = 1 then move[1] := cancel
  561.     else move[1] := move[3];
  562.     if settimer(hwindow, 1, 1, nil) = 0 then begin
  563.       messagebox(hwindow, 'No timers left !', 'Error', mb_ok);
  564.       halt(1);
  565.     end;
  566.   end;
  567.   move[3] := 0;
  568.   buttondown := false;
  569.   moved := false;
  570. end;
  571.  
  572. procedure tqueenwindow.wmmousemove(var msg : tmessage);
  573. var x, y, head, tail : integer;
  574. begin
  575.   if move[3] <> 0 then
  576.     with game[move[3]] do
  577.       if canmove then begin
  578.         buttondown := true;
  579.         moved := true;
  580.         x := msg.lparamlo - gx - move[1];
  581.         y := msg.lparamhi - gy - move[2];
  582.         newgx := gx + x;  newgy := gy + y;
  583.         moving;
  584.         offsetrect(pos[row, col].rects, x, y);
  585.         gx := newgx;  gy := newgy;
  586.         drawbmp(0, gx, gy, cardsize, card[deck]);
  587.       end;
  588. end;
  589.  
  590. procedure tqueenwindow.wmrbuttondown(var msg : tmessage);
  591. var i1 : integer;
  592. begin
  593.   if not game[1].onscreen then begin
  594.     killtimer(hwindow, 1);
  595.     for i1 := 1 to 53 do
  596.       game[i1].onscreen := false;
  597.     invalidaterect(hwindow, nil, true);
  598.     level := level + 1;
  599.     if messagebox(hwindow, 'Do you want another one ?', 'You did it !',
  600.       mb_yesno or mb_iconexclamation) = id_yes then newgame
  601.     else done;
  602.   end
  603.   else newgame;
  604. end;
  605.  
  606. procedure tqueenwindow.wmtimer(var msg : tmessage);
  607. var i1, x, y : integer;
  608.   angle : real;
  609.   procedure chase(i2, x, y :integer);
  610.   begin
  611.     with game[i2] do begin
  612.       if (gx < 5) or (gx > 625) then canopen := not canopen;
  613.       if canopen then gx := gx - 5 * x
  614.       else gx := gx + 5 * x;
  615.       if (gy < 5) or (gy > 375) then canmove := not canmove;
  616.       if canmove then gy := gy - 5 * x
  617.       else gy := gy + 5 * x;
  618.       drawbmp(0, gx, gy, cardsize, card[deck]);
  619.     end;
  620.   end;
  621. begin
  622.   if level = 4 then level := 1;
  623.   case level of
  624.     1 : for i1 := 1 to 50 do begin
  625.       chase(1, 1, 1);
  626.       chase(move[1], 1, 1);
  627.     end;
  628.     2 : for i1 := 1 to 50 do begin
  629.       x := random(21) * 35;
  630.       y := random(11) * 48;
  631.       case random(3) of
  632.         0 : drawbmp(0, x, y, cardsize, card[38]);
  633.         1 : drawbmp(0, x, y, cardsize, card[game[move[1]].deck]);
  634.         2, 3 : drawbmp(0, x, y, cardsize, face[back]);
  635.       end;
  636.     end;
  637.     3 : for i1 := 0 to 72 do begin
  638.       angle := i1 * pi /36;
  639.       x := round(cos(angle) * (1 - sin(angle)) * 150);
  640.       y := 47 - round(sin(angle) * (1 - sin(angle)) * 150);
  641.       drawbmp(0, 315 + x, y, cardsize, card[38]);
  642.       drawbmp(0, 315 - x, y, cardsize, card[game[move[1]].deck]);
  643.     end;
  644.   end;
  645. end;
  646.  
  647. procedure tmyapplication.initmainwindow;
  648. begin
  649.   mainwindow := new(pqueenwindow, init(nil, appname));
  650. end;
  651.  
  652. var myapp : tmyapplication;
  653. begin
  654.   myapp.init(appname);
  655.   myapp.run;
  656.   myapp.done;
  657. end.
  658.